<?php
/**
 * 接收 管理
 *
 * @author    Alex Xun xunzhibin@expert.com
 * @version   1.0
 * @copyright (C) 2018 Jnexpert Ltd. All rights reserved
 * @file      receive\controller\v1\Index.php
 */

namespace app\receive\controller\v1;

use controller\BasicWechat;
use think\Log;
use app\common\request\Http;

/**
 * 接收 控制器类
 *
 * @author Alex Xun xunzhibin@jnexpert.com
 * @package controller
 */
class Index extends BasicWechat
{
    /**
     * 公众号 第三方库 初始化
     *
     * 根据具体所需服务，实例不同的接口类
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     * @since 2.0
     */
    protected function initVendor()
    {
        // 实例化 第三方库
        $this->wechat = new \WeChat\Receive($this->config);
    }

    /**
     * 接收 普通消息、事件推送
     *
     * 普通微信用户向公众账号发消息时，微信服务器将POST消息的XML数据包到次方法，并根据内容回复
     * 文本、图片、语音、视频、小视频、地理位置、链接等
     * 在微信用户和公众号产生交互的过程中，用户的某些操作会使得微信服务器通过事件推送的形式通知到此方法，并根据内容回复
     * 关注、取消关注、扫描带参数二维码、上报地理位置、自定义菜单等
     *
     * @api
     * @author Alex Xun xunzhibin@jnexpert.com
     * @since 2.0
     **/
    public function index()
    {
        // 当前 推送接口类型
        $msgType = $this->wechat->getMsgType();

        // 当前 推送 来源用户的openid
        $openid = $this->wechat->getOpenid();

        // 当前 推送所有数据
        $data = $this->wechat->getReceive();

        // 推送 来源用户 基本信息
        $wechat = new \WeChat\User($this->config);
        $user = $wechat->getUserInfo($openid);

        // 保存 来源用户 基本信息
        $request = new Http();
        $result = $request->curl_request($this->config['save_user_api'], 'POST', $user);
        if(false === $result || false === $result['status']) {
            Log::error(
                ' receive_error msg: write_user_info_error;'
                . ' 文件: ' . __FILE__ . ';'
                . ' 函数名称: ' . __FUNCTION__ . ';'
                . ' 行号: ' . __LINE__ . ';'
                . ' param: ' . json_encode($user, JSON_UNESCAPED_UNICODE) . ';'
                . ' result' . json_encode($result, JSON_UNESCAPED_UNICODE) . ';'
            );
        }

        // 被动回复内容
        $reply_result = $request->curl_request(
            $this->config['passive_reply_api'],
            'GET',
            $data
        );

        if(false != $reply_result || false !== $reply_result['status']) {
            $reply_data = $reply_result['data'];

            // 被动回复 方法
            $reply_method = isset($reply_data['reply_type'])
                            ? strtolower('reply_' . $reply_data['reply_type'])
                            : '';
            if( method_exists($this, $reply_method) )
            {
                // 方法 存在
                $this->$reply_method($reply_data);
            }
        }

        exit('success');
    }

    /**
     * 被动回复 文本消息
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     * @since 2.0
     */
    protected function reply_text($data)
    {
        /**
         * $data = [
         *      'reply_content' => '回复文本内容'
         * ]
         */
        $this->wechat->text($data['reply_content'])->reply();
    }

    /**
     * 被动回复 图片消息
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     * @since 2.0
     */
    protected function reply_image($data)
    {
        /**
         * $data = [
         *      'media_id' => '回复图片媒体ID'
         * ]
         */
         $api->image($data['media_id'])->reply();
    }

    /**
     * 被动回复 语音消息
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     * @since 2.0
     */
    protected function reply_voice($data)
    {
        /**
         * $data = [
         *      'media_id' => '回复语音媒体ID'
         * ]
         */
         $api->voice($data['media_id'])->reply();
    }

    /**
     * 被动回复 视频消息
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     * @since 2.0
     */
    protected function reply_video($data)
    {
        /**
         * $data = [
         *       'media_id' => '回复视频媒体ID',
         *       'title'    => '视频标题',
         *       'desc'     => '视频描述'
         * ]
         */
        $api->video($data['media_id'], $data['title'], $data['desc'])->reply();
    }

    /**
     * 被动回复 音乐消息
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     * @since 2.0
     */
    protected function reply_music($data)
    {
        /**
         * $data = [
         *      'title'      => '音乐标题',
         *      'desc'       => '音乐描述',
         *      'musicUrl'   => '音乐地址',
         *      'hgMusicUrl' => '高清音乐地址',
         *      'thumbe'     => '音乐图片缩略图的媒体ID'
         * ]
         */
        $api->music($data['title'] ,$data['desc'], $data['musicUrl'], $data['hgMusicUrl'], $data['thumbe'])->reply();
    }

    /**
     * 被动回复 图文消息
     *
     * @author Alex Xun xunzhibin@jnexpert.com
     * @since 2.0
     */
    protected function reply_news($data)
    {
        /**
         * $data = [
         *      'news' => [
         *          'title'  => '图文消息标题',
         *          'desc'   => '图文消息描述',
         *          'picUrl' => '图片链接',
         *          'url'    => '点击图文消息跳转链接'
         *      ]
         * ]
         */
        $api->news($data['news'])->reply();
    }
}
